#!/bin/bash
<<comment
SCRIPYT:Baselinecheck.sh
AUTHOR:kaipengcheng@hcis.com.cn
DATE:2023-02-01
DESCRIBE:使用主机安全对主机进行基线检查，并解决检测到的相关配置风险，使用脚本直接执行，不用在到配置文件进行手动修改或删除。
SYSTEM:CentOS 7
WARNING:本脚本针对得基线检查策略包括等保合规中的CentOS 7策略以及华为云安全实践中的SSH策略。
VERSION:1.0.0
MODIFY:个别中危和大部分低危本脚本未收录，请根据实际情况自行判断。个别影响操作规则默认是注释状态，如"限制root用户SSH远程登录"，如有需求自行修改。
comment

#1等保合规-CentOS 7

#1.1高危的威胁等级

#规则1.1.1：口令生存期
#规则描述： 该设置确定在系统要求用户更改某个密码之前可以使用改口令的期限及口令过期提前告警时间（以天为单位），此策略使得攻击者用来破解用户密码以及访问网络资源的时间受到限制
#修改建议：设置配置文件/etc/login.defs的选项：PASS_MAX_DAYS 90(10~90), PASS_MIN_DAYS 10, PASS_WARN_AGE 7，同时对已有用户还需要修改/etc/shadow文件中有密码且可登录用户（root用户除外）的口令保持有效的最大天数为大于等于10且小于等于90，两次修改口令之间所需的最小天数为10，口令失效告警时间为7。
#执行命令：

PASS_MAX_DAYS=`cat /etc/login.defs |grep ^PASS_MAX_DAYS|awk -F '\t' '{print $2}'`
sed -i "s/PASS_MAX_DAYS\t$PASS_MAX_DAYS/PASS_MAX_DAYS\t90/g" /etc/login.defs

PASS_MIN_DAYS=`cat /etc/login.defs |grep ^PASS_MIN_DAYS|awk -F '\t' '{print $2}'`
sed -i "s/PASS_MIN_DAYS\t$PASS_MIN_DAYS/PASS_MIN_DAYS\t10/g" /etc/login.defs

#vim /etc/shadow
#找到自己的用户
#修改末尾 10:90:7:::
#退出 :wq!


#规则1.1.2：口令复杂度
#规则描述： 该设置确定用户账户口令包含的最少字符数
#修改建议： 编辑/etc/pam.d/password-auth 和 /etc/pam.d/system-auth文件，分别修改
#把原先那条删除，添加以下的数据
#执行命令：
sed -i '/.pam_pwquality.so/c\password requisite pam_pwquality.so try_first_pass retry=3 minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1' /etc/pam.d/password-auth
sed -i '/.pam_pwquality.so/c\password requisite pam_pwquality.so try_first_pass retry=3 minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1' /etc/pam.d/system-auth

#规则1.1.3：文件与目录缺省权限控制
#规则描述：该设置确定新创建的目录和文件的默认权限
#修改建议： 设置/etc/profile /etc/profile.d/.sh、/etc/bashrc文件中的umask配置为027（或者0027）。
#执行命令：
sed -i 's/umask 022/umask 027/g' /etc/profile
sed -i 's/umask 022/umask 027/g' /etc/bashrc

#规则1.1.4： 禁止wheel组以外的用户使用su - root命令
#规则描述：使用PAM认证模块进行su权限控制，禁止wheel组之外的用户使用su - root命令
#修改建议： 修改或添加配置文件/etc/pam.d/su的条目：auth sufficient pam_rootok.so
#auth  required pam_wheel.so group=wheel或auth required pam_wheel.so use_uid
#执行命令
sed -i '/.pam_rootok.so/a\auth required pam_wheel.so  group=wheel' /etc/pam.d/su

#规则1.1.5：限制root用户SSH远程登录
#规则描述：拒绝root用户通过ssh协议远程登录 ssh协议版本为2echo 'PermitRootLogin no
#修改建议：在文件/etc/ssh/sshd_config添加如下配置：PermitRootLogin no Protocol 2
#备注：PermitRootLogin的默认值为yes，Protocol的默认值为2
#执行命令
#echo 'PermitRootLogin no' >>/etc/ssh/sshd_config
#echo 'Protocol 2' >> /etc/ssh/sshd_config

#*注意：执行后ssh远程登录会拒绝访问

#规则1.1.6：登陆超时时间设置
#规则描述：设置定时帐户自动登出时间。
#修改建议：在/etc/profile文件中添加以下内容：TMOUT 300
#执行命令
echo 'export TMOUT=300' >> /etc/profile

#1.2 中低威胁等级

#规则1.2.1：口令重复次数限制
#规则描述：重新启用某个旧密码，要确保此密码在继上次使用后已被修改过几次。 此策略是管理员能够通过确保旧密码不被连续重新使用来增强安全性
#修改建议：
#编辑配置文件/etc/pam.d/system-auth和文件/etc/pam.d/password-auth修改或添加配置： password sufficient pam_unix.so remember=5 或password required pam_pwhistory.so remember=5 备注：使用remember=5配置覆盖原有模块配置
#备注：使用remember=5配置覆盖原有模块配置
#执行命令：
echo 'password sufficient pam_unix.so remember=5'  >> /etc/pam.d/system-auth
echo 'password sufficient pam_unix.so remember=5'  >> /etc/pam.d/password-auth

#规则1.2.2：修改SSH的Banner警告信息
#规则描述： 检查ssh服务状态，若不开启则pass，若开启则检查是否设置ssh登录告警信息，设置则pass。
#修改建议：如果ssh服务不需要，需要关闭该服务。如果需要ssh服务，则需要配置/etc/ssh/sshd_config文件中Banner /etc/issue.net，并在对应的路径文件中配置警告标示：Authorized users only. All activity may be monitored and reported.
#执行命令：
sed -i "/#Banner none/a Banner /etc/issue.net" /etc/ssh/sshd_config
echo "Authorized users only. All activity may be monitored and reported." >/etc/issue.net

#规则1.2.3：检查不活跃的密码锁定是否小于等于30天
#规则描述：在给定时间段内已停用的用户帐户可以自动禁用。建议在密码到期后30天内处于非活动状态的帐户被禁用。
#修改建议：执行以下命令检查INACTIVE是否为30或更少：useradd -D | grep INACTIVE
#执行命令：
useradd -D -f 30
egrep ^[^:]+:[^\!*] /etc/shadow| egrep -v "^\s*#|root" | awk -F: '{print $1":"$7}' | egrep -v ".*:(30|[1-2][0-9]|[1-9])$"
#输出的user名
#执行 chage --inactive 30  <user>
#复制

#规则1.2.4：配置用户最小授权
#规则描述：检查文件/etc/passwd、/etc/shadow、/etc/group、/etc/services、/etc/xinetd.conf和目录/etc/security的权限
#修改建议：设置文件/etc/passwd、/etc/group、/etc/services的权限为644
#设置文件/etc/shadow的权限为400，
#设置/etc/xinetd.conf文件、/etc/security目录权限为600
#设置以上文件及目录的属主和属组是否均为root:root r=4，w=2，x=1
#修改命令
#ll /etc/passwd   /etc/group  /etc/services  /etc/shadow   查看权限
chmod 400 /etc/shadow
chmod 600 /etc/security
chown root:root /etc/passwd

#规则1.2.5：设置关键文件的属性
#规则描述： 检查/var/log/messages文件是否存在a属性
#修改建议：使用命令更改该日志文件属性：chattr +a /var/log/messages
#修改命令：
chattr +a /var/log/messages

#规则1.2.6：检查AIDE是否安装
#规则描述：AIDE生产一个文件系统状态的快照，其中包括修改时间，权限和文件哈希值，然后可以其与文件系统的当前状态进行比较，以检测对系统的修改
#修改命令：
yum -y install aide

#规则1.2.7：系统core dump状态
#规则描述：查看/etc/security/limits.conf文件中是否配置如下内容： soft core 0、* hard core 0,查看/etc/profile文件中是否存在如下配置：ulimit -S -c 0 > /dev/null 2>&1
#修改命令：
echo -e "* soft core 0\n* hard core 0" >>/etc/security/limits.conf

#规则1.2.8：禁止ICMP重定向
#规则描述：禁止ICMP重定向,查看文件/etc/sysctl.conf或/etc/sysctl.d/中net.ipv4.conf.all.accept_redirects参数，值为0合规， 执行命令：1.sysctl net.ipv4.conf.all.accept_redirects ；2.cat /etc/sysctl.conf /etc/sysctl.d/ | grep -v '^\s#' | grep "net.ipv4.conf.all.accept_redirects" | uniq
#修改命令：
echo 'net.ipv4.conf.all.accept_redirects=0' >>/etc/sysctl.conf
sysctl -p

#规则1.2.9：检查可疑数据包是否被记录
#规则描述： 开启功能后，将不可发送源地址的数据包记录到内核日志。
#规则建议：设置文件/etc/sysctl.conf或/etc/sysctl.d/的参数：net.ipv4.conf.all.log_martians=1 和 net.ipv4.conf.default.log_martians=1
#修改命令
echo 'net.ipv4.conf.all.log_martians=1 ' >>/etc/sysctl.conf
echo 'net.ipv4.conf.default.log_martians=1' >>/etc/sysctl.d/*

#规则1.2.10：口令锁定策略
#规则描述： 设置口令认证失败后的锁定策略
#修改建议：在配置文件/etc/pam.d/system-auth和/etc/pam.d/password-auth中添加 auth required pam_faillock.so preauth audit silent deny=5 unlock_time=180 auth [success=1 default=bad] pam_unix.so auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=180 auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=180
#执行命令：
echo -e "auth required pam_faillock.so preauth audit silent deny=5 unlock_time=180\nauth [success=1 default=bad] pam_unix.so\nauth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=180\nauth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=180" >>/etc/pam.d/system-auth
echo -e "auth required pam_faillock.so preauth audit silent deny=5 unlock_time=180\nauth [success=1 default=bad] pam_unix.so\nauth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=180\nauth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=180" >>/etc/pam.d/password-auth

#规则1.2.11：删除无关账号
#规则描述： 删除无关账号
#修改建议：删掉不符规范的用户，执行：userdel username。或者编辑/etc/passwd文件，修改用户的密码字段和shell域。
#执行命令：
userdel sync
userdel halt

#规则1.2.12： 打开syncookie缓解syn flood攻击
#规则描述： 打开syncookie缓解syn flood攻击，
#规则建议：修改文件/etc/sysctl.conf或/etc/sysctl.d/的参数net.ipv4.tcp_syncookies = 1
#执行命令：
echo 'net.ipv4.tcp_syncookies = 1' >>/etc/sysctl.conf

#规则1.2.13： 禁止IP源路由
#规则建议：设置文件/etc/sysctl.conf或/etc/sysctl.d/的以下参数：
#net.ipv4.conf.all.accept_source_route = 0  net.ipv4.conf.default.accept_source_route = 0
#执行命令：
echo 'net.ipv4.conf.all.accept_source_route = 0 ' >>/etc/sysctl.conf
echo 'net.ipv4.conf.default.accept_source_route = 0' >>/etc/sysctl.conf


#规则1.2.14： 禁止IP路由转发
#规则建议：设置文件/etc/sysctl.conf或/etc/sysctl.d/的参数：net.ipv4.ip_forward = 0
#执行命令：
echo 'net.ipv4.ip_forward = 0'   >>/etc/sysctl.conf


#规则1.2.15： 确保忽略广播的ICMP请求
#规则描述：系统忽略所有广播和多播地址的ICMP回显和时间戳记请求，把配置文件/etc/sysctl.conf或/etc/sysctl.d/*中net.ipv4.icmp_echo_ignore_broadcasts的参数设置为1
#规则建议：设置文件/etc/sysctl.conf或/etc/sysctl.d/的参数为：net.ipv4.icmp_echo_ignore_broadcasts = 1
#执行命令：
echo 'net.ipv4.icmp_echo_ignore_broadcasts = 1' >>/etc/sysctl.conf

#规则1.2.16：历史命令设置
#修改建议：在文件/etc/profile中修改添加如下配置：
#        HISTFILESIZE=5
#        HISTSIZE=5
#执行命令：
echo 'HISTFILESIZE=5' >>/etc/profile
sed -i "s/HISTSIZE=1000/HISTSIZE=5/g" /etc/profile

#规则1.2.17：禁止组合键关机
#规则描述： 禁止Control-Alt-Delete重启动机器命令
#修改建议：删掉/usr/lib/systemd/system/reboot.target文件
#执行命令：
rm -rf /usr/lib/systemd/system/reboot.target

#2修复检测SSH的风险规则、

#2.1 高危的威胁等级

#规则2.1.1：需限制/etc/ssh/sshd_config的访问权限
#规则描述
： /etc/ssh/sshd_config文件包含sshd的配置内容。
#修改建议：运行以下命令设置/etc/ssh/sshd_config的所有权和权限：
##chown root:root /etc/ssh/sshd_config#chmod og-rwx /etc/ssh/sshd_config
#执行命令：
chown root:root /etc/ssh/sshd_config
chmod og-rwx /etc/ssh/sshd_config

#规则2.1.2：确保SSH中HostbasedAuthentication关闭
#规则描述： HostbasedAuthentication参数指定是否允许受信任的主机通过使用.rhosts 或/etc/hosts.equiv进行认证；当公钥客户端认证成功，用户即登录；此选项仅使用于SSH 2
#编辑/etc/ssh/sshd_config文件设置参数如下:
#HostbasedAuthentication no
#执行命令：
sed -i 's/#HostbasedAuthentication no/HostbasedAuthentication no/g' /etc/ssh/sshd_config

#规则2.1.3：确保SSH PermitEmptyPasswords被禁用
#规则描述： PermitEmptyPasswords参数指定SSH服务器是否允许使用空密码字符串登录帐户
#编辑/etc/ssh/sshd_config文件，加入如下内容：
#PermitEmptyPasswords no
#执行命令：
sed -i 's/#PermitEmptyPasswords no/PermitEmptyPasswords no /g' /etc/ssh/sshd_config

#规则2.1.4：使用更加安全的Ciphers算法
#规则描述： 此变量限制SSH在通信期间可以使用的密码类型。
#修改建议：编辑/etc/ssh/sshd_config文件，加入如下内容： Ciphers aes256-ctr,aes192-ctr,aes128-ctr。
#执行命令：
sed -i "/#RekeyLimit default none/a Ciphers aes256-ctr,aes192-ctr,aes128-ctr" /etc/ssh/sshd_config

#规则2.1.5：确保使用更安全的MAC算法
#规则描述： 此变量限制SSH可以在通信期间使用的MAC算法的类型。
#修改建议：编辑/etc/ssh/sshd_config文件，根据站点策略设置参数，以下内容包括所有支持和接受的MAC：MACs hmac-sha2-512,hmac-sha2-256。
#执行命令：
sed -i "/Ciphers aes256-ctr,aes192-ctr,aes128-ctr/a MACs hmac-sha2-512,hmac-sha2-256" /etc/ssh/sshd_config

#规则2.1.6：需限制SSH服务使用的密钥文件权限
#规则描述： SSH的private key与public key文件为服务器访问的私钥和公钥文件修改建议：# chmod 400 <文件名>   //修改文件权限 # chown -R root:root <文件>  //修改文件属主为root
#执行命令：
chmod 400 /etc/ssh/*key
chmod 400 /etc/ssh/*key.pub
chown -R root:root /etc/ssh/*key
chown -R root:root /etc/ssh/*key.pub

#2.2中低威胁等级
#规则2.2.1：确保SSH X11转发被禁用
#规则描述：参数X11Forwarding提供了操作远程连接X11界面的功能。
#修改建议：编辑/etc/ssh/sshd_config文件确保参数设置如下:
#X11Forwarding no
#执行命令：
sed -i 's/#X11Forwarding:space:*yes/X11Forwarding no/g' /etc/ssh/sshd_config
sed -i 's/X11Forwarding yes/X11Forwarding no/g' /etc/ssh/sshd_config

#规则2.2.2：确保SSH中MaxAuthTries设置小于等于4
#规则描述：MaxAuth参数指定了最大认证登录次数；当登录次数达到半数，错误信息将会被写到syslog文件中，记录详细的登录失败信息
#修改建议：编辑/etc/ssh/sshd_config文件，设置参数如下:
#MaxAuthTries 4
#执行命令：
sed -i 's/#MaxAuthTries 6/MaxAuthTries 4/g' /etc/ssh/sshd_config

#规则2.2.3：确保SSH中IgnoreRhosts设置为enabled
#规则描述：IgnoreRhosts参数指定.rhosts和.shosts文件不能在RhostsRSAAuthentication或者HostbasedAuthentication中使用。
#修改建议：编辑/etc/ssh/sshd_config文件设置参数如下:
#IgnoreRhosts yes
#执行命令：
sed -i 's/#IgnoreRhosts yes/IgnoreRhosts yes/g' /etc/ssh/sshd_config

#规则2.2.4：确保配置了SSH空闲超时间隔
#规则描述：ClientAliveInterval和ClientAliveCountMax这2个选项控制ssh会话的超时。 设置ClientAliveInterval变量时，将终止在指定时间内没有活动的ssh会话。 设置ClientAliveCountMax变量时，sshd将在每个ClientAliveInterval间隔发送客户端活着的消息。 当连续的客户端活动消息的数量没有来自客户端的响应被发送时，ssh会话被终止。 例如，如果ClientAliveInterval设置为15秒，ClientAliveCountMax设置为3，客户端ssh会话将在空闲时间45秒后终止。
#修改建议：编辑/etc/ssh/sshd_config文件以设置参数如下：
#ClientAliveInterval 300
#ClientAliveCountMax 0
#执行命令：
sed -i 's/#ClientAliveInterval 0/ClientAliveInterval 300/g' /etc/ssh/sshd_config && sed -i 's/#ClientAliveCountMax 3/ClientAliveCountMax 0/g' /etc/ssh/sshd_config

#规则2.2.5：确保SSH PermitUserEnvironment被禁用
#规则描述：PermitUserEnvironment选项允许用户向ssh守护程序呈现环境选项。
#修改建议：编辑/etc/ssh/sshd_config文件，加入如下内容：
#PermitUserEnvironment no
#执行命令：
sed -i 's/#PermitUserEnvironment no/PermitUserEnvironment no/g' /etc/ssh/sshd_config

#规则2.2.6：确保SSH LoginGraceTime设置为一分钟或更短
#规则描述：LoginGraceTime参数指定成功验证SSH服务器的时间。宽限期的时间越长，可以存在更开放的未认证连接。宽限期应限制在适当的组织限制，以确保服务可用于所需的访问
#修改建议： 编辑/etc/ssh/sshd_config文件，设置参数如下：
#LoginGraceTime 60
#执行命令：
sed -i 's/#LoginGraceTime 2m/LoginGraceTime 60/g' /etc/ssh/sshd_config

#规则2.2.7：确保设置了SSH警告提示信息
#规则描述：Banner参数指定在允许身份验证之前必须将其内容发送给远程用户的文件。默认情况下，不显示警告信息。
#修改建议：编辑/etc/ssh/sshd_config文件以设置参数如下：
#执行命令：
#***若在SSH已修复，可不做。即本脚本只执行一次
#sed -i "/#Banner none/a Banner /etc/issue.net" /etc/ssh/sshd_config

#规则2.2.8：限制SFTP用户访问目录
#规则描述:默认情况，SFTP登录用户能访问的数据是受操作系统的目录及文件权限配置限制的，这将导致未经授权的访问发生。使用Chroot功能，可以将用户的访问限制在特定的目录中，该目录可以是用户的Home目录或者指定的目录。 如果系统启用了SFTP，且提供的SFTP服务，则必须对SFTP用户进行访问限制。
#修改建议：注：以ftpuser为例说明配置chroot的方法 创建sftp业务用户组sftpgroup #groupadd sftpgroup 创建sftp业务账号，并添加到sftpgroup组中 #useradd -m -G sftpgroup -s /sbin/nologin sftpuser 修改用户密码 #passwd sftpuser 修改chroot目录属主为root:root #chown root:root /home/sftpuser 修改sshd_config添加如下配置 Match Group sftpgroup ChrootDirectory /home/sftpuser #限定访问目录 ForceCommand internal-sftp #限制链接只能使用sftp X11Forwarding no #关闭X11转发 AllowTcpForwarding no #关闭TCP转发 重启sshd服务 #service sshd restart 上述配置将sftp用户限定在了/home/sftpuser目录，如果要限定在其他目录，可通过修改ChrootDirectory配置。 对chroot目录的要求如下： 1） chroot目录owner为root:root，权限不大于755，其所有上级目录权限要求相同； 2） chroot子目录，权限不大于755。 3） 禁止配置常见的非业务使用目录，如/ /root /etc /bin /boot /lib /lib64。
#执行命令：
groupadd sftpgroup
useradd -m -G sftpgroup -s /sbin/nologin sftpuser
sudo passwd sftpuser "123456"
chown root:root /home/sftpuser
#注：需添加在UseDNS之后
sed -i "/UseDNS no/a\Match Group sftpgroup\nChrootDirectory /home/sftpuser\nForceCommand internal-sftp\nX11Forwarding no\nAllowTcpForwarding no\n" /etc/ssh/sshd_config


#规则2.2.9：配置SFTP服务使用internal-sftp
#规则描述：通过Subsystem可以配置一个外部子系统，通常用来指定SFTP服务的守护进程。OpenSSH中可提供SFTP服务的进程包括sftp-server和internal-sftp。sftp-server是一个独立的二进制文件，提供SFTP服务端功能。internal-sftp是一个进程内的SFTP服务，它出现较晚，支持sftp-server的所有功能，且与ChrootDirectory一起使用时配置更加简单，是当前推荐使用的SFTP组件。 默认情况下，SSHD服务未启用任何的子系统，此时，SSHD服务只允许SSH登录，不允许使用SFTP。
#修改建议：编辑/etc/ssh/sshd_config文件以设置参数如下：
#执行命令：
sed -i "s/Subsystem/#Subsystem/g" /etc/ssh/sshd_config
sed -i "/UseDNS no/a\Subsystem sftp internal-sftp -l INFO -f AUTH" /etc/ssh/sshd_config

#重新加载配置文件使策略项生效
sysctl -p  /etc/sysctl.conf
#重启sshd服务
service sshd restart
